home *** CD-ROM | disk | FTP | other *** search
/ Gold Medal Software 3 / Gold Medal Software - Volume 3 (Gold Medal) (1994).iso / windows / graphs / multicon.arj / ICONWND.CPP < prev    next >
C/C++ Source or Header  |  1994-03-10  |  9KB  |  300 lines

  1. //*************************************************************
  2. //  File name: ICONWND.H
  3. //
  4. //  Description:
  5. //    Implementation for the CIconWnd class
  6. //
  7. //  History:    Date       Author     Comment
  8. //              3/7/94     FJB        Created
  9. //
  10. // Written by Microsoft Product Support Services, Windows Developer Support
  11. // Copyright (c) 1994 Microsoft Corporation. All rights reserved.
  12. //*************************************************************
  13.  
  14. #include "stdafx.h"
  15. #include "multicon.h"
  16. #include "iconwnd.h"
  17. #include "modview.h"
  18.  
  19. //*************************************************************
  20. //  Class:
  21. //      CIconWnd 
  22. //
  23. //  Description:
  24. //      AppWizard generated CMDIChildWnd class that dynamically displays the
  25. //      output from it's view as an icon.
  26. //
  27. //  Derived from:
  28. //      CMDIChildWnd
  29. //
  30. //  Data Members: 
  31. //      CDC       m_dcXOR;        // a memory CDC for icon's XOR bitmap
  32. //      CDC       m_dcAND;        // a memory CDC for icon's AND plane
  33. //      HBRUSH    m_hbrNull;      // NULL brush for drawing bounding rect      
  34. //
  35. //  Member Functions:
  36. //      CIconWnd          : Constructor
  37. //     ~CIconWnd          : Destructor
  38. //  
  39. //    Implementation:
  40. //      PreCreateWindow   : Registers a NULL icon
  41. //
  42. //    Message Handlers:
  43. //      OnPaint           : Scales the view's output down to icon size.
  44. //      OnQueryDragIcon   : Converts current output to an icon
  45. //      OnCreate          : Does some initialization
  46. //      OnDestroy         : Does some cleanup
  47. //
  48. //  Comments
  49. //      This class requires a CView derived class that exposes a public
  50. //      OnDraw override.
  51. //      
  52. //
  53. //  History:    Date       Author     Comment
  54. //              3/7/94     FJB        Created
  55. //
  56. //*************************************************************  
  57.  
  58.  
  59. #ifdef _DEBUG
  60. #undef THIS_FILE
  61. static char BASED_CODE THIS_FILE[] = __FILE__;
  62. #endif
  63.  
  64. /////////////////////////////////////////////////////////////////////////////
  65. // CIconWnd
  66.  
  67. IMPLEMENT_DYNCREATE(CIconWnd, CMDIChildWnd)
  68.  
  69. CIconWnd::CIconWnd()
  70. {
  71. }
  72.  
  73. CIconWnd::~CIconWnd()
  74. {
  75. }    
  76.  
  77.    
  78. //*************************************************************
  79. //
  80. //  Class
  81. //      CIconWnd
  82. //
  83. //  Member Function:
  84. //      PreCreateWindow
  85. //
  86. //  Purpose:
  87. //     Registers a window class with a NULL icon.
  88. //
  89. //  Parameters:
  90. //      cs - a CREATESTRUCT reference
  91. //
  92. //  Return: BOOL
  93. //     TRUE  - creation should contine
  94. //     FALSE - stop creation
  95. //   
  96. //
  97. //  Comments:
  98. //     In order to provide an animated icon for a minimized window, it is 
  99. //     necessary to use a window class that specifies a NULL icon.  This will 
  100. //     allow the window to receive WM_PAINT messages while it is minimized so
  101. //     it can render it's iconic appearance. 
  102. //
  103. //  History:    Date       Author     Comment
  104. //              3/7/94     FJB        Created
  105. //
  106. //*************************************************************
  107.  
  108.  
  109. BOOL CIconWnd::PreCreateWindow (CREATESTRUCT &cs)
  110. {   
  111.    if (CMDIChildWnd::PreCreateWindow(cs))
  112.    {
  113.       cs.lpszClass = AfxRegisterWndClass ( 
  114.                            CS_DBLCLKS | CS_HREDRAW |
  115.                            CS_VREDRAW,
  116.                            AfxGetApp()->LoadStandardCursor(
  117.                                              IDC_ARROW),
  118.                                              (HBRUSH) (COLOR_WINDOW + 1),
  119.                                              0);  // NULL icon
  120.       return TRUE;
  121.     }    
  122.     else 
  123.       return NULL;
  124. }
  125.  
  126.  
  127. BEGIN_MESSAGE_MAP(CIconWnd, CMDIChildWnd)
  128.    //{{AFX_MSG_MAP(CIconWnd)
  129.    ON_WM_PAINT()
  130.    ON_WM_QUERYDRAGICON()
  131.    ON_WM_CREATE()
  132.    ON_WM_DESTROY()
  133.    //}}AFX_MSG_MAP
  134. END_MESSAGE_MAP()
  135.  
  136.  
  137. /////////////////////////////////////////////////////////////////////////////
  138. // CIconWnd message handlers
  139.  
  140.  
  141. //*************************************************************
  142. //
  143. //  Class
  144. //      CIconWnd
  145. //
  146. //  Member Function:
  147. //      OnPaint
  148. //
  149. //  Purpose:
  150. //     Renders icon by scaling the view's output.
  151. //
  152. //  Comments:
  153. //     When a view is minimized, it's parent (CMDIChildWnd) is responsible
  154. //     for rendering it's iconic appearance.  In other words, the
  155. //     CMDIChildWnd's OnPaint handler will be called when the view is
  156. //     minimized.  Instead of duplicating the view's output code, instead
  157. //     call the view's OnDraw function to perform the output.  Note that
  158. //     MM_ANISOTROPIC mode is used to scale the view's output to fit. 
  159. //
  160. //     CView::OnDraw is protected, meaning it can only be called from a CView
  161. //     member function.  To get around this, CModView is derived from CView,
  162. //     and OnDraw is made public. 
  163. //
  164. //  History:    Date       Author     Comment
  165. //              3/7/94     FJB        Created
  166. //
  167. //************************************************************* 
  168.  
  169.  
  170. void CIconWnd::OnPaint()
  171. {
  172.    CPaintDC dc(this); // device context for painting
  173.    CRect rc; 
  174.    // get the view
  175.    CModView* pView = (CModView*) GetActiveView();
  176.    ASSERT(pView); 
  177.    // get the view's dimensions
  178.    pView->GetWindowRect(&rc);  
  179.    // set MM_ANISOTROPIC so we can scale the view's output
  180.    dc.SetMapMode(MM_ANISOTROPIC);
  181.    
  182.    int cxIcon = GetSystemMetrics(SM_CXICON);
  183.    int cyIcon = GetSystemMetrics(SM_CYICON);
  184.       
  185.    dc.SetViewportExt( cxIcon, cyIcon); 
  186.    dc.SetWindowExt(rc.Width(),rc.Height());   
  187.  
  188.    // have the view do it's thing
  189.    pView->OnDraw(&dc);           
  190.    // select in the NULL brush and draw the bounding rect
  191.    CBrush* pbrOld = dc.SelectObject(CBrush::FromHandle(m_hbrNull));
  192.    dc.Rectangle(0,0,rc.Width()-1,rc.Height()-1);
  193.    dc.SelectObject(pbrOld);
  194.    
  195. }
  196.   
  197.  
  198. //*************************************************************
  199. //
  200. //  Class
  201. //      CIconWnd
  202. //
  203. //  Member Function:
  204. //      OnQueryDragIcon
  205. //
  206. //  Purpose:
  207. //      Converts current window contents into an icon.
  208. //
  209. //  Comments:
  210. //      When the user clicks the animated icon, the frame window will 
  211. //      receive an WM_QUERYDRAGICON message.  The frame window must convert
  212. //      it's output to an icon using the CreateIcon API.  See the GDIRCRS
  213. //      sample for details on converting to and from icons.    
  214. //
  215. //  History:    Date       Author     Comment
  216. //              3/7/94     FJB        Created
  217. //
  218. //*************************************************************
  219.  
  220.  
  221. HCURSOR CIconWnd::OnQueryDragIcon()
  222. {   
  223.    // find out how big an icon is
  224.    int cxIcon = GetSystemMetrics(SM_CXICON);
  225.    int cyIcon = GetSystemMetrics(SM_CYICON); 
  226.    
  227.    // get the CDC* for the frame window
  228.    CDC* pdcSrc = GetDC();
  229.  
  230.    // create and select the XOR bitmap
  231.    CBitmap bmpXOR;
  232.    bmpXOR.CreateCompatibleBitmap(pdcSrc, cxIcon, cyIcon);
  233.    CBitmap* pbmpOld1 = m_dcXOR.SelectObject(&bmpXOR);
  234.    
  235.    // copy the current window contents to the XOR bitmap
  236.    m_dcXOR.BitBlt(0, 0, cxIcon, cyIcon, pdcSrc,
  237.                   0, 0, SRCCOPY); 
  238.    
  239.    // create and select the AND bitmap (1 bit plane)
  240.    CBitmap bmpAND;
  241.    bmpAND.CreateBitmap(cxIcon, cyIcon, 1, 1, NULL);
  242.    CBitmap* pbmpOld2 = m_dcAND.SelectObject(&bmpAND); 
  243.    
  244.    m_dcAND.BitBlt(0,0,cxIcon, cyIcon, &m_dcXOR, 0, 0, SRCCOPY);
  245.  
  246.    m_dcXOR.SelectObject(pbmpOld1);
  247.    m_dcAND.SelectObject(pbmpOld2);
  248.    
  249.    // get the bitmap data for ::CreateIcon
  250.    BITMAP bm;
  251.    bmpAND.GetObject(sizeof(BITMAP), &bm);
  252.    int cb = bm.bmWidthBytes * bm.bmHeight * bm.bmPlanes;
  253.    LPBYTE lpbAND = new __far BYTE[cb];  
  254.    bmpAND.GetBitmapBits(cb, lpbAND);
  255.    
  256.    bmpXOR.GetObject(sizeof(BITMAP), &bm);   
  257.    cb = bm.bmWidthBytes * bm.bmHeight * bm.bmPlanes;
  258.    LPBYTE lpbXOR = new __far BYTE[cb];
  259.    bmpXOR.GetBitmapBits(cb, lpbXOR);   
  260.    
  261.    // make the icon
  262.    HICON hIcon = ::CreateIcon( AfxGetInstanceHandle(),
  263.                        cxIcon,
  264.                        cyIcon,
  265.                        bm.bmPlanes,
  266.                        bm.bmBitsPixel, 
  267.                        lpbAND,
  268.                        lpbXOR);
  269.    
  270.    // cleanup and return the icon
  271.    delete (BYTE __far *)lpbAND;
  272.    delete (BYTE __far *)lpbXOR;
  273.    ReleaseDC(pdcSrc);
  274.  
  275.    return hIcon;   
  276. }
  277.  
  278. int CIconWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
  279. {
  280.    if (CMDIChildWnd::OnCreate(lpCreateStruct) == -1)
  281.       return -1;
  282.    CWindowDC dc(this);
  283.    m_dcXOR.CreateCompatibleDC(&dc); // for efficiency, create these once
  284.    m_dcAND.CreateCompatibleDC(&dc);
  285.    m_hbrNull = (HBRUSH) ::GetStockObject(HOLLOW_BRUSH);  
  286.    
  287.    return 0;
  288. }
  289.  
  290. void CIconWnd::OnDestroy()
  291. {
  292.    CMDIChildWnd::OnDestroy();
  293.    
  294.    m_dcXOR.DeleteDC();
  295.    m_dcAND.DeleteDC();
  296. }
  297.  
  298.  
  299.  
  300.